﻿<%
'''底层错误类,
'建立在环境正确下的错误抛出
'环境错误则抛出严重错误(程序停止运行)而不执行本类方法
Class Ashapo_Err_Class

	'最后错误代码
	Private s_lastErrNum
	'错误信息字典,错误字典的分配问题
	'000-099分配给系统错误，采取语言包定义增强性能
	'000特殊,预留
	'001-020-fso
	'021-030-asp
	'031-070-tpl
	Private s_errDict
	'错误收集器
	Public Collector

	'''构造
	Private Sub Class_Initialize()
		'表示无错误/未知错误
		s_lastErrNum = "000"
		Dim t_dn : t_dn = C_DICT_NAME
		Set s_errDict = Server.CreateObject(t_dn)
		Set Collector = Server.CreateObject(t_dn)
	End Sub
	
	'''析构
	Private Sub Class_Terminate()
		Set s_errDict = Nothing
		Set Collector = Nothing
	End Sub
	
	'''格式化错误代号,如将0转化为000，10转化为010
	'p_n:要格式化的字符串
	Private Function formatErrNum_(Byval p_n)
		If IsNumeric(p_n) Then
			p_n = Cint(p_n)
			If p_n < 10 Then
				formatErrNum_ = "00" & Cstr(p_n)
			ElseIf p_n < 100 Then
				formatErrNum_ = "0" & Cstr(p_n)
			Else
				formatErrNum_ = Cstr(p_n)
			End If
		Else
			formatErrNum_ = p_n
		End If
	End Function
	
	'''获取错误字典信息,默认使用
	'p_n:错误字典键值(建议使用100以上的数字)
	Public Default Property Get E(Byval p_n)
		'000-099直接语言包返回错误定义
		If IsNumeric(p_n) Then
			If Cint(p_n) < 100 Then
				E = Eval("Cstr(" & C_LANG_PREFIX & "STR_ERR_" & formatErrNum_(p_n) & ")")
				Exit Property
			End If
		End If
		'常规情况使用错误字典
		If s_errDict.Exists(Cstr(p_n)) Then
			E = s_errDict(Cstr(p_n))
		Else
			E = Eval("Cstr(" & C_LANG_PREFIX & "STR_ERR_NDF)")
		End If
	End Property
	
	'''设置错误信息字典
	'p_n:错误字典键值(建议使用100以上的数字)
	'p_s:错误描述,建议使用多语设置
	Public Property Let E(Byval p_n, Byval p_s)
		'禁止修改底层错误信息
		If IsNumeric(p_n) Then
			If Cint(p_n) < 100 Then
				Exit Property
			End If
		End If
		If Has(p_n) And Has(p_s) Then
			If p_n > "" Then
				'用户可以修改覆盖已有的错误信息
				s_errDict(formatErrNum_(p_n)) = p_s
			End If
		End If
	End Property
	
	'''获取最后一个错误代码
	Public Property Get LastError()
		LastError = s_lastErrNum
	End Property
	
	'''根据错误代码收集错误
	Public Sub Raise(Byval p_n)
		If IsN(p_n) Then Exit Sub
		s_lastErrNum = p_n
		Collector(formatErrNum_(p_n)) = E(p_n)
		'在Sa中执行日志写入动作
		'Sa.Log.Error(E(p_n))
	End Sub
	
	'''输出已定义的错误字典(测试用)
	Public Sub Defined()
		Dim t_key
		If Has(s_errDict) Then
			For Each t_key In s_errDict
				Response.Write(t_key & " : " & s_errDict(t_key) & "<br />" & VbCrLf)
			Next
		End If
	End Sub
	
	'''直接抛出错误信息(需要进行修改，考虑放入Sa)
	'传入数字则根据错误收集器id
	'传入字符串则直接显示该错误信息
	'如果传入的是语言自定义包则可以支持多语
	'如果不加Sa是否可以运行?
	Public Sub [Throw](Byval p_msg)
		Response.Write(p_msg)
		Response.End
		If IsNumeric(p_msg) Then
			'Call Sa.Go500(Cint(p_msg), "", "")
		Else
			'Call Sa.Go500("", "", p_msg)
		End If
	End Sub
End Class
%>